设计程序最重要的一个步骤就是选择一个表示数据的好方法,在多数情况下,使用简单的变量甚至是数组都是不够的。
我们将从研究程序设计的关键部分,即程序表示数据的方式入手。通常程序开发的重要部分是找到针对程序中所使用的数据的较好的表示方法。正确地表示数据能够使程序其余部分的编写变得简单,如简单变量、数组、指针、结构、联合。
寻找正确的数据表示方式,不仅仅是选择一种数据类型,还必须考虑到哪些操作是必须的,也就是说,必须考虑如何存储数据,并且必须定义对数据类型来说哪些操作是有效的。
例如,C实现通常将C的int类型和指针类型都存储为整数,但是这两种类型有不同的有效操作集。比如,可能将一个整数与另一个整数相乘,但是不能将一个整数和另一个指针相乘。可以有*运算符来对一个指针取值,但是这个运算对于整数来说是无意义的。C语言为其基本类型定义了有效操作。但是,当您设计了一个方案来表示数据时,您可能需要自己来定义有效操作。在C中,可以通过把所需的操作编写为函数来做到这一点。简而言之,设计数据类型包括确定如何存储数据以及设计一系列函数来管理数据。
您还将看到一些算法(algorithm),即操纵数据的方法;
设计数据类型的过程,这是一个将算法和数据表示方法相匹配的过程,如一些常用的数据形式,如队列、列表、以及二叉树;
假如您要创建一个地址簿程序。您将使用何种数据形式来存储信息?因为与每个项目相关的信息有很多类型,所以用一个结构来表示每一个项目显得很适合。如何表示多个项目?是标准的结构数组、动态数组,还是其他形式?各个项目需要按字母顺序排列吗?需要能够按邮政编码来搜索项目吗?需要执行的动作将影响您对如何存储信息的决定。简而言之,在开始编写代码之前,您需要做出许多设计上的决定。
数据结构是计算机存储、管理数据的方式,是数据元素的集合,合理的数据结构可以给程序带来更高的运行和存储效率。
事物往往具有多方面的属性,例如描述一个学生的信息,可能要包括学号、姓名、性别、年龄、成绩、班级等方面。对此,C语言中提供了能够描述此类数据的构造数据类型,即结构体和联合体。
C的结构体提供了在同一个数据对象中存储几通常是不同类型的数据项的方法;
有时需要将不同类型的数据组合成一个有机的整体,以便于引用。如:
一个学生有学号/姓名/性别/年龄/地址等属性 int num; char name[20];char sex;
int age; int char addr[30];
声明一个结构体类型的一般形式为:
struct 结构体名
{成员表列};
如:struct student
{
int num;char name[20];char sex;
int age;float score;char addr[30];
}
将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型,因为可以定义出许许多多种具体的结构体类型。
使几个不同的变量共占同一段内存的结构称为“共用体”类型的结构。
定义共用体类型变量的一般形式为:
union 共用体名
{
成员表列
}变量表列;
共用体和结构体的比较:
结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。
共用体变量所占的内存长度等于最长的成员的长度。
共用体类型数据的特点
(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。
(2) 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
(3) 共用体变量的地址和它的各成员的地址都是同一地址。
(4) 不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。
(5) 不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针
(6) 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。
枚举:将变量的值一一列举出来,变量的值只限于列举
出来的值的范围内。
说明:
(1)在C编译中,对枚举元素按常量处理,故称枚举常量。它们不是变量,不能对它们赋值。
(2) 枚举元素作为常量,它们是有值的,C语言编译按定义时的顺序使它们的值为0,1,2…
(3) 枚举值可以用来作判断比较。
(4) 一个整数不能直接赋给一个枚举变量。
用typedef声明新的类型名来代替已有的类型名。
声明INTEGER为整型
typedef int INTEGER
声明结构类型
Typedef struct{
int month;
int day;
int year;}DATE;
① 先按定义变量的方法写出定义体(如:int i)。
② 将变量名换成新类型名(例如:将i换成COUNT)。
③ 在最前面加typedef
(例如:typedef int COUNT)。
④ 然后可以用新类型名去定义变量。
typedef与#define有相似之处,例如:
typedef int COUNT;#define COUNT int的作用都是用COUNT代表int。但事实上,它们二者是不同的。
#define是在预编译时处理的,它只能作简单的字符串替换,而typedef是在编译时处理的。实际上它并不是作简单的字符串替换,而是采用如同定义变量的方法那样来声明一个类型。